package com.sunrise.configuracoes.bean;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ComponentSystemEvent;

import lombok.Getter;

import org.springframework.stereotype.Controller;

import com.sunrise.configuracoes.servico.ManterMetaService;
import com.sunrise.configuracoes.visao.MetaForm;
import com.sunrise.generico.bean.ManterBean;
import com.sunrise.generico.entidade.Categoria;
import com.sunrise.generico.entidade.Filial;
import com.sunrise.generico.entidade.Marca;
import com.sunrise.generico.entidade.Meta;
import com.sunrise.generico.entidade.Perfil;
import com.sunrise.generico.entidade.Produto;
import com.sunrise.generico.entidade.RegraMeta;
import com.sunrise.generico.entidade.Usuario;
import com.sunrise.generico.enums.TipoStatus;
import com.sunrise.generico.util.MessagesUtil;
import com.sunrise.generico.visao.Filtro;

@ManagedBean
@ViewScoped
@Controller
public class ManterMetaBean extends ManterBean<Meta> {

	@Resource
	@Getter
	private ManterMetaService metaService;

	@Resource
	@Getter
	private MetaForm formulario;

	@Override
	public void inicializarEntidade() {
		setEntidade(new Meta());
		getEntidade().setAtivo(Boolean.TRUE);
		getEntidade().setFilial(new Filial());
		inicializarFormulario();
	}

	private void inicializarFormulario() {
	}

	@Override
	public void preRenderList(ComponentSystemEvent event) {
		setStatus(Arrays.asList(TipoStatus.values()));
		inicializarEntidade();
		setFiltro(new Filtro());
		getFiltro().setAtivo(getStatus().iterator().next());
		carregarFormulario();
		buscarPorFiltros();
	}

	@Override
	public void preRenderNew(ComponentSystemEvent event) {
		if (getEntidade() == null) {
			inicializarEntidade();
		}
		carregarFormulario();

	}

	@Override
	public String alterar() {
		if(getEntidade().getRegras() == null || getEntidade().getRegras().isEmpty()){
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("regrasObrigatorio"));
			return null;
		}
		getService().merge(getEntidade());
		MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("alteradoSucesso"));
		return getListar();
	}

	@Override
	public void preRenderEdit(ComponentSystemEvent event) {
		carregarFormulario();
	}

	private void carregarFormulario() {
		getFormulario().setRegra(new RegraMeta());
		getFormulario().setFiltroClasse("");
		Collection<Filial> filiais = getMetaService().listarFiliaisPorUsuario(obterUsuarioLogado());
		if (filiais != null && !filiais.isEmpty()) {
			getFormulario().setFiliais(filiais);
			getFiltro().setIdFilial(filiais.iterator().next().getId());
		}

	}

	@Override
	public String salvar() {
		if(getEntidade().getRegras() == null || getEntidade().getRegras().isEmpty()){
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("regrasObrigatorio"));
			return null;
		}
		
		getEntidade().setCriador(obterUsuarioLogado());
		getEntidade().setDataCriacao(new Date());
		getMetaService().inserir(getEntidade());
		MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("criadoSucesso"));
		buscarPorFiltros();
		return getListar();
	}

	@Override
	public String salvarContinuar() {
		if(getEntidade().getRegras() == null || getEntidade().getRegras().isEmpty()){
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("regrasObrigatorio"));
			return null;
		}
		getEntidade().setCriador(obterUsuarioLogado());
		getEntidade().setDataCriacao(new Date());
		getMetaService().inserir(getEntidade());
		MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("criadoSucesso"));
		buscarPorFiltros();
		return criarEntidade();
	}

	public void buscarPorFiltros() {
		setEntidades(getMetaService().listarMetaPorFiltro(getFiltro()));
	}

	public String habilitar() {
		try {
			getEntidade().setAtivo(Boolean.TRUE);
			getService().alterar(getEntidade());
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("registroHabilitadoSucesso"));
			buscarPorFiltros();
			return getListar();
		} catch (Exception e) {
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("registroNaoHabilitado"));
			return null;
		}
	}

	public String desabilitar() {
		try {
			getEntidade().setAtivo(Boolean.FALSE);
			getService().alterar(getEntidade());
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("registroDesabilitadoSucesso"));
			buscarPorFiltros();
			return getListar();
		} catch (Exception e) {
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("registroNaoDesabilitado"));
			return null;
		}
	}

	public List<String> listarClasses(String nome) {
		return getMetaService().listarClasses(nome, obterUsuarioLogado(), getEntidade().getFilial());

	}

	@Override
	public List<Meta> iniciarlizarListEntidade() {
		return null;
	}

	public void adicionarRegra() {
		if (getEntidade().getRegras() == null) {
			getEntidade().setRegras(new ArrayList<RegraMeta>());
		}
		getEntidade().getRegras().add(getFormulario().getRegra());
		getFormulario().setFiltroClasse("");
		getFormulario().setRegra(new RegraMeta());

	}

	public void adicionarClasseRegra() {
		String[] classeRegra = getFormulario().getFiltroClasse().split("\\|");

		if (classeRegra[0].contains("Marca")) {
			Marca marca = getMetaService().buscarMarcaPorNome(classeRegra[1].trim());
			if (marca != null) {
				getFormulario().getRegra().setMarca(marca);
			}
		} else if (classeRegra[0].contains("Produto")) {
			Produto produto = getMetaService().buscarProdutoPorNome(classeRegra[1].trim());
			if (produto != null) {
				getFormulario().getRegra().setProduto(produto);

			}
		} else if (classeRegra[0].contains("Vendedor")) {
			Usuario usuario = getMetaService().buscarVendedorPorNome(classeRegra[1].trim());
			if (usuario != null) {
				getFormulario().getRegra().setVendedor(usuario);
			}
		} else if (classeRegra[0].contains("Perfil")) {
			Perfil perfil = getMetaService().buscarPerfilPorNome(classeRegra[1].trim());
			if (perfil != null) {
				getFormulario().getRegra().setPerfil(perfil);
			}
		} else if (classeRegra[0].contains("Categoria")) {
			Categoria categoria = getMetaService().buscarCategoriaPorNome(classeRegra[1].trim());
			if (categoria != null) {
				getFormulario().getRegra().setCategoria(categoria);
			}
		} else if (classeRegra[0].contains("Filial")) {
			Filial filial = getMetaService().buscarFilialPorNome(classeRegra[1].trim());
			if (filial != null) {
				getFormulario().getRegra().setFilial(filial);
			}
		}

	}

	public void removerRegraMeta() {
		getEntidade().getRegras().remove(getFormulario().getRegraRemover());
	}

}
